NEWS
新闻中心
AUTOASR通信篇 之 Com模块详解下
发布时间:2025-06-29 浏览数:411


01
Com模块配置参数介绍






ComGeneral





主要是Com模块的一些通用配置参数









ComIPdu





包含Com模块的协议数据单元(IPDU)的配置参数







ComIPduCounter





该容器为可选容器,包含协议数据单元(PDU)计数器的配置参数








ComTxIPdu





如果IPDU的方向配置为发送时,需要配置该容器,此容器包含协议数据单元I-PDU的其他与传输相关的配置参数。 









ComIPduGroup





前文解释过IPDU组的概念,这里主要是配置一些组,供Pdu去引用







ComSignal





前文也解释过信号,这里是信号的一些具体配置参数




好了,因为篇幅问题,关于Com模块的主要配置,就介绍到这里。想要了解完整版的模块配置,大家不妨前往网页端的配置工具<<<<【 EasySAR 】>>>   (点击跳转),亲自上手配置一番。接下来,我们会探讨信号的收发流程,以及一些常见问题。

毕竟,光是嘴上说,始终如同纸上谈兵。强烈建议大家搭建一套属于自己的学习环境,无论是配置内容还是后续要讲的知识点,都需要结合代码来理解,这样才能真正掌握其中精髓。




02
报文发送过程(Transmit)








对于发送报文,Com层将Signal封装成I-pdu后调用Pdur_ComTransmit向下传输,整个过程如上图所示:

Step 1:应用层数据准备与信号更新

  • 应用层的SWC可通过RTE与信号组进行Pport - Rport连接来发送数据。发送时,先调用Com_UpdateShadowSignal函数,将待发送的数据拷贝到Signal Group的Shadow buffer中。例如在下边的示例代码中,通过多次调用Com_UpdateShadowSignal,将data数组中的各元素分别拷贝到对应信号的shadow buffer。

  • 信号或信号簇数据根据配置完成字节序转换后,更新到I-PDU的相应位置。

Step 2:信号组相关操作

  • 当被调用的Com_SendSignalCom_Invalidatsignal的信号属于一个信号组时,Com模块仅更新该信号组的Shadow缓冲区。若I-PDU内容未发生变化,无需进行如TMS评估那样的进一步I-PDU处理。

  • 调用Com_SendSignalGroup函数,Com模块会自动以原子操作的方式将Shadow缓冲区内容复制到I-PDU buffer,并触发IPDU的数据发送(调用PduR_Transmit)。例如,对于属于group_x的两个组信号signal_a和signal_b,先通过Com_SendSignal分别将它们复制到shadow缓冲区,再通过Com_SendSignalGroup将shadow缓冲区内容复制到I - PDU 。

Step 3:I-PDU发送模式选择与发送

  • 消息类型判定与处理:依据信号配置判断是内部消息还是外部消息。若为内部发送:直接将信号数据复制到接收信号数据区,并执行通知操作。若为外部发送:若信号发送属性为触发,其所属I-PDU立即发送(I-PDU为周期传输模式除外);若为延迟,则不进行传输。

  • 发送模式选择:AUTOSAR COM规范允许同一个I-PDU配置两种发送模式。计算I - PDU内各信号的传输模式(见上篇文章介绍)条件后,I-PDU选定一种模式进行发送。发送后启动发送死限监控,并调用PduR_ComTransmit()函数将I-PDU发送到底层。

上层通过RTE调用Com_SendSignal()接口,更新需要发送Signal数值,注意:此时信号数值只是更新到了发送缓冲区。信号值的发送,依赖信号所在的Tx I-PDU周期。同时,COM层的发送主函数Com_MainFunctionTx()周期判断每一个Tx I-PDU周期到时与否,如果Tx I-PDU周期到时,调用PduR的发送接口发送Tx I-PDU.

对于周期型报文,假设:Com_MainFunctionTx()周期 = 10ms,周期型报文Tx I-PDU对应的发送周期为30ms,发送行为如下所示:




需要注意:上层信号的更新频率不应超过Tx I-PDU的发送周期,否则信号值被覆盖,如下所示:




大家可能在想:使用Queue机制不可以吗?信号数据队列发送,遗憾的是:目前,Autosar规范中的信号发送行为,不考虑Queue。

对于事件型报文,假设:Com_MainFunctionTx()周期 = 10ms,事件型报文Tx I-PDU对应的最小发送间隔为20ms,发送行为如下所示:





同样,上层信号的更新频率过快,会导致发送信号的数值被覆盖,如下所示:






03
三、报文接收过程(Reception)








当一个Pdu报文由下层PduR传输到Com层后,由Com模块进行拆包,并上报到上层,具体如下:

Step 1 :底层接收与初步处理

  • 由PduR调用Com_RxIndication向上通知Com层接收Pdu.

  • 为基于I-Pdu的超时监控,重置接收截止时间监控定时器(DM)

Step 2 : 信号处理与转换

调用信号或信号组的接收函数,处理I-PDU中的信号,根据PDU类型不同,处理方式不同:

  • Defered I-PDU:仅完成数据拷贝,信号解析在下一个主函数中进行。

  • Immediate I-PDU:完成数据拷贝后,还要解析信号和信号组数。

Step 3: 信号处理细节

  • 对信号依次进行检查更新位、字节序转换、符号扩展

  • 检查数据是否有效,如果信号无效,根据配置执行无效动作(可以不配置)

    • 信号无效通知,则直接调用Com_CbkRxInv通知Rte,

    • 默认值替换,将信号值替换为配置的默认值

  • 如果信号值有效,继续进行信号过滤

  • 通过信号过滤后,重置基于Signal的死限监控处理,如果超时,调用Com_CbkRxTout通知RTE层

  • 检查信号是否配置了通知函数,如果配置了直接调用Com_CbkRxAck通知RTE层,否则的话将信号存到缓冲区中,等待上层调用Com_ReceiveSignal/Signalgroup获取信号值




    04
    Com模块一些经典的问题








信号和信号组相关问题





问题1:什么是Signal Group,为什么要用Signal Group?

在AUTOSAR概念体系中,为有效支持复杂数据类型,AUTOSAR COM给出了信号组这一针对性解决方案。Com模块能够以统一且连贯的方式,对信号组进行发送与接收操作,确保了复杂数据类型在传输过程中所需的一致性。

:通俗来讲,信号组可理解为一个I-PDU中若干Signal的集合。这些集合内的Signal在操作时需维持一致性。以车道线相关数据为例,车道线的一阶参数、二阶参数、三阶参数以及常数项,分别对应4个不同的Signal。当外部发送方对其中一个或多个Signal进行改动时,接收方必须同时对这些Signal进行更新。否则,最终在仪表上呈现的车道线形态,可能会偶尔与实际情况出现偏差。

问题2:一个信号又属于一个信号组,那么可以为这个信号和所在的信号组都配置Notificaition吗?

:AUTOSAR规范规定,一个Signal配置为一个Signal Group的Group Signal后只能有Signal Group的Notification。(可能有一点绕,当一个信号属于一个信号组的时候,值个信号就叫做组信号)

问题3:信号组包括的信号可以跨不同IPDU吗?

:不可以,当一个信号归属于某一个信号组之后,该信号就不能被Pdu单独引用了。

问题4:RTE在获取一个Signal时,如果这个Signal属于一个Signal Group,那么Signal的值从Signal的buffer获取还是Shadow buffer获取?

: 从Shadow buffer中获取。





Rx Signal Filter有何用?





在车载通信开发中,信号有效性校验是常见的核心问题。以车速信号(Vehicle_Signal)为例,该信号采用uint16数据类型,有效量程定义为0-300km/h。当检测到信号值超出阈值范围时,系统将启动信号过滤机制,舍弃无效数据帧并保留历史有效值。这种场景可通过AUTOSAR标准中的Rx Signal Filter模块进行标准化处理。

一个I-PDU会包含1~N个Signal(N为大于1的正整数),这些Signal可以不包含在任何SignalGroup中,也可以包含在多个SignalGroup中。

为更好地理解Signal Filter,这里讨论一下信号的接收处理流程

Step1:Com模块接收到包含5个信号元素的I-PDU数据包(Signal0~Signal5),其中Signal1/3/5隶属SignalGroup1。模块执行协议数据单元解包操作,提取各独立信号。

Step2:在Com层,将接收到的I-PDU拆分成Signal,如果信号有过滤条件Filter Condition,则进行过滤判断;

Step3:如果Filter 结果为FALSE,则丢弃该信号,对应的Rx Signal Buffer不更新。如果Filter 结果为TRUE,则更新信号对应的Rx Signal Buffer;

Autosar规范中解释Signal Filter Condition = False,如果这个Signal不在SignalGroup中,该信号对应的接收缓存区数值无需更新;如果这个Signal在SignalGroup中,该信号组对应的接收缓存区数值无需更新,即:保存上次值

Step4:如果信号不属于任何的SignalGroup,上层可以直接调用Com_ReceiveSignal()接口,从Rx Signal Buffer获取信号数据。如果信号属于某个SignalGroup,则需要通过Com_ReceiveSignalGroup()接口,将信号数据从Rx Signal Buffer缓存区Copy到SignalGroup Rx Buffer(shadow buffer),之后上层再通过Com_ReceiveSignal()接口读取信号值。

Rx Signal接收流程如下所示:







Tx Signal Filter与Tx Mode有何关系?





:从上边的问题,我们知道Rx Signal Filter可以检查信号阈值。那么Tx Signal Filter能否也检查信号阈值呢?AUTOSAR规范给出了答案:Tx Signal Filter不能检查信号发送的阈值,只是I-PDU发送模式的判断依据。Tx I-PDU有哪些发送模式呢?ComTxModeTrue或者ComTxModeFalse。如下通过一个示例分析ComTxMode与Tx Signal Filter关系:如下通过一个示例分析ComTxMode与Tx Signal Filter关系:

Step1:如果信号不包含在任何TxSignalGroup中,上层通过调用Com_SendSignal()接口,直接更新Tx Signal Buffer。如果信号包含在某个TxSignalGroup中,上层通过调用Com_SendSignal()接口,更新SignalGroup Tx Buffer(Shadow Buffer)中信号数据,之后通过Com_SendSignalGroup()接口更新Tx Signal Buffer;

Step2:通过Filter Condition检查Tx Signal过滤条件;

Step3:TMS(Transmission Mode Selector)判断Tx I-PDU中每个Signal的发送模式接口,如果其中一个Signal的检查结果是TRUE,则Tx I-PDU选择ComTxModeTrue发送行为;如果所有的Signal的检查结果均为FALSE,则Tx I-PDU选择ComTxModeFalse发送行为。

Tx Signal的发送行为如下所示:






ComTxModeTrue、ComTxModeFalse使用场景?





答:为什么一个Tx I-PDU会有ComTxModeTrue、ComTxModeFalse发送模式呢?一个Tx I-PDU的发送类型有:DIRECT、MIXED、PERIODIC。

  • DIRECT:事件型,比如:连续发送3次,发送最小间隔20ms。

  • PERIODIC:周期型,比如:每100ms发送一次。

  • MIXED:包含DIRECT、PERIODIC两种发送行为。

ComTxModeTrue、ComTxModeFalse可以存在这样的使用场景:Tx I-PDU Mode = TRUE时,使用PERIODIC发送行为;Tx I-PDU Mode = FALSE时,使用DIRECT发送行为。

参考资料
[1] AUTOSAR_SRS_COM.pdf,R19-11和4.2.2
[2] AUTOSAR_SWS_COM.pdf,R19-11和4.2.2
[3] AUTOSAR_SWS_PDURouter.pdf,R19-11和4.2.2

服务热线:

0551-65691812

地址:合肥高新区安徽工业技术创新研究院A座
邮箱:gk.anghui@outlook.com

Copyright © 2001-2025 安徽国科昂辉科技有限公司 - All Rights Reserved.
皖ICP备2024030710号-1